import preferences from '@ohos.data.preferences';
import common from '@ohos.app.ability.common';
import Logger from './LoggerUtil';

class PreferenceUtil {
  private pref: preferences.Preferences
  // 应用数据仓库的名称
  private storageName = 'ResourceBedStore'

  // 为本应用设置一个持久化数据仓库
  async loadPreference(context: common.UIAbilityContext) {
    try { // 加载preferences
      this.pref = await preferences.getPreferences(context, this.storageName)
      Logger.debug(`加载Preferences[${this.storageName}]成功`)
    } catch (e) {
      Logger.debug(`加载Preferences[${this.storageName}]失败`, JSON.stringify(e))
    }
  }

  // 向仓库中设置数据
  async putValue(key: string, value: preferences.ValueType) {
    if (!this.pref) {
      Logger.debug(`Preferences[${this.storageName}]尚未初始化！无法设置键值`)
      return
    }
    try {
      await this.pref.put(key, value) // 写入数据
      await this.pref.flush() // 刷盘
      Logger.debug(`保存Preferences[${key} = ${value}]成功`)
    } catch (e) {
      Logger.debug(`保存Preferences[${key} = ${value}]失败`, JSON.stringify(e))
    }
  }

  // 从仓库中提取出数据
  async getValue(key: string, defaultValue: preferences.ValueType) {
    if (!this.pref) {
      Logger.debug(`Preferences[${this.storageName}]尚未初始化！无法获取键值`)
      return
    }
    try {
      // 读数据
      // 给定 defaultValue 的目的是确保在无法成功获取偏好设置值时，
      // 也能够返回一个合理的值，以便在代码中进行后续处理或使用。
      let value = await this.pref.get(key, defaultValue)
      Logger.debug(`读取Preferences[${key} = ${value}]成功`)
      return value
    } catch (e) {
      Logger.debug(`读取Preferences[${key}]失败`, JSON.stringify(e))
    }
  }

  // 删除仓库中的某个值
  async removeValue(key: string) {
    if (!this.pref) {
      Logger.debug(`Preferences[${this.storageName}]尚未初始化！无法删除键值`)
      return;
    }
    try {
      await this.pref.delete(key); // 删除指定键值对
      Logger.debug(`删除Preferences[${key}]成功`);
    } catch (e) {
      Logger.debug(`删除Preferences[${key}]失败`, JSON.stringify(e));
    }
  }
}

const preferenceUtil = new PreferenceUtil()

export default preferenceUtil as PreferenceUtil

//
// 仓库的键值
export const AgreeToLicenseKey = 'agreeToLicense'

export const TokenKey = 'token'

export const Cookie = 'resourceBedCookie'

export const UserInfo = 'userInfo'

